\documentclass{article}
\usepackage{CJK}
\usepackage{ctex}
\usepackage{graphicx}

\begin{document}
\begin{CJK}{UTF8}{gbsn}
\CJKindent
系列最开始当然要提到很经典的文章——Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations。这篇文章是布朗大学的助理教授 Maziar Raissi 和学术大牛GE Karniadakis 一起写的，文章分为两部分，第一部分写的是 Data-driven solutions of nonlinear partial differential equations，就是在讲怎么解 PDEs（Partial Differential Equations），第二部分写的是 Data-driven discovery of nonlinear partial differential equations，就是在讲怎样解PDE的反问题 (带参数的PDE，参数需要在解的过程中求解出来)。由于其基本想法很接近，我们只谈第一部分，简略的讲第二部分。

下面便进入正题。监督学习是机器学习中的一个大类，很多分类问题，回归问题都可以用它来解决。那么，从求解PDE的角度来看，监督学习能发挥什么样的作用呢？

如何逼近一个函数（算子）一直以来便是数学中的难题。 数学家们发展了很多工具来逼近函数， 如插值理论，框架， 谱方法 ， 有限元等。 从逼近论的角度来看， 神经网络（Neural Networks）便可以看做一个非线性函数逼近器。 我们期望输出一个数据， 通过神经网络输出的值可以反应出输入数据的好坏， 有效性等， 从而有助于我们理解问题。 假设我们限制神经网络输出的值是一维的， 那么对于 binary classfication 来说， 我们可以把大于 0 的分为一类， 小于 0 的分为另一类。但是对于一个PDE来说， 我们如何来判断输入数据的好坏呢？

给定一个非线性PDE
\\
\begin{displaymath}
  u_{t}+N[u;\lambda]=0
\end{displaymath}

其中$u(x;t)$是要求的解，$N[u;\lambda]$是非线性偏微分算子，$\lambda$是需要待定的参数。为简单起见，我们假设$N[u;\lambda]=N(u)$。用一个具体的例子（Burgers方程）来说明主要的想法和步骤

$u_{t}+uu_{x}-(0,01/\pi)u_{xx}=0$,\quad $x\in[-1,1],\quad t\in[0,1]$,

$u(0,x)=-\sin(\pi x)$,

$u(t,-1)=u(t,1)=0$.

定义$f$为$f=u_{t}+uu_{x}-(0.01/\pi)u_{xx}$,利用 Neural Networks 来逼近$u(x,t)$。定义损失函数为

$MSE=MSE_{u}+MSE_{f}$,

其中
\begin{displaymath}
MSE_{u}=\frac{1}{N_{u}}\sum_{i=1}^{N_{u}}\mid u(t^{i}_{u},x^{i}_{u})-u^{i}\mid^{2},
\end{displaymath}

\begin{displaymath}
  MSE_{f}=\frac{1}{N_{f}}\sum_{i=1}^{N_{f}}\mid f(t^{i}_{f},x^{t}_{f})\mid^{2},
\end{displaymath}

这里 $\{t_u^i,x_u^i,u^i\}_{i=1}^{N_u}$定义了$u(x,t)$的初边值训练数据，$\{t_f^i,x_f^i\}_{i=1}^{N_f}$定义了$f(x,t)$的配置点的训练数据（内部）。

我们来分析一下损失函数。如果神经网络能很好地求解出PDE的解，那么对于来自初边值的任一个点，其值$MSE_u \to 0$;对于内部的配置点，因为很好地拟合了微分方程，$MSE_f\to 0$.也就是说，损失函数的值为$0$时，我们便可以说在训练集上每个点都有$u_{NN}(x,t)\approx u(x,t)$。这样便问题便转化为如何优化损失函数。

利用神经网络的反向传播机制和L-BFGS便可以求解。作者使用了tensorflow1.13 版本来求解。 值得注意的是， 我们处理$u_t$,$u_x$,$u_{xx}$时不能用 tensorflow 的反向传播机制来计算， 因为反向传播计算的对参数 $\Theta=\{weights,biases\}$的导数，处理的代码是\\
$def\  u(t,x):$\\
$ u = neural\_net(tf.concat([t,x],1),weights,biases)$\\
$ return \  u$\\
$def\  f(t,x)$\\
$u=u(t,x)$\\
$u\_ t=tf.gradients(u,t)[0]$\\
$u\_ x=tf.gradients(u,x)[0]$\\
$u\_ xx=tf.gradients(u\_ x,x)[0]$\\
$f=u\_ t+u*u\_ x-(0.01/tf.pi)*u\_ xx$\\
$return\  f$\\

最后解的结果L2 误差为$1.6e-03$， 解的图像为

\begin{figure}[htb]
  \centering
      \includegraphics[width=10cm]{1.png}
\end{figure}

\begin{figure}[htb]
  \centering
      \includegraphics[width=10cm]{2.png}
\end{figure}


对于求解带参数的PDE，只需将$\Theta=\{weights,biases\}$ 转变为$\Theta = \{weights,biases,{\color{Red} \lambda}\}$ 即可。


\end{CJK}
\end{document}
